From c7876d9e88c5e104f8023121eafba54b9ac6676f Mon Sep 17 00:00:00 2001 From: "adsharma@los-vmm.sc.intel.com" Date: Tue, 9 Aug 2005 11:06:44 -0800 Subject: [PATCH] Handle VMX domains correctly across xend restarts This patch remembers the device model pid across xend restarts and avoids creating duplicate device model processes. Also, device models don't inherit socket fds from xend (which are closed on exec now), which used to prevent xend restarting. Signed-off-by: Yunhong Jiang Signed-off-by: Xiaohui Xin Signed-off-by: Arun Sharma --- tools/python/xen/web/connection.py | 4 ++++ tools/python/xen/web/reactor.py | 2 +- tools/python/xen/web/tcp.py | 3 +++ tools/python/xen/xend/XendDomainInfo.py | 7 ++++++- tools/python/xen/xend/image.py | 6 +++++- tools/python/xen/xend/server/relocate.py | 3 ++- 6 files changed, 21 insertions(+), 4 deletions(-) diff --git a/tools/python/xen/web/connection.py b/tools/python/xen/web/connection.py index 73607d3a60..9c526bd341 100644 --- a/tools/python/xen/web/connection.py +++ b/tools/python/xen/web/connection.py @@ -20,6 +20,7 @@ import sys import threading import select import socket +import fcntl from errno import EAGAIN, EINTR, EWOULDBLOCK @@ -152,6 +153,9 @@ class SocketListener: def createSocket(self): raise NotImplementedError() + def setCloExec(self): + fcntl.fcntl(self.sock.fileno(), fcntl.F_SETFD, fcntl.FD_CLOEXEC) + def acceptConnection(self, sock, protocol, addr): return SocketServerConnection(sock, protocol, addr, self) diff --git a/tools/python/xen/web/reactor.py b/tools/python/xen/web/reactor.py index 540354f27b..2be9126988 100644 --- a/tools/python/xen/web/reactor.py +++ b/tools/python/xen/web/reactor.py @@ -16,4 +16,4 @@ #============================================================================ from unix import listenUNIX, connectUNIX -from tcp import listenTCP, connectTCP +from tcp import listenTCP, connectTCP, SetCloExec diff --git a/tools/python/xen/web/tcp.py b/tools/python/xen/web/tcp.py index ce3c12ec57..ed57d45159 100644 --- a/tools/python/xen/web/tcp.py +++ b/tools/python/xen/web/tcp.py @@ -85,6 +85,9 @@ def listenTCP(port, factory, interface='', backlog=None): l.startListening() return l +def SetCloExec(SocketListener): + SocketListener.SetCloExec() + def connectTCP(host, port, factory, timeout=None, bindAddress=None): c = TCPConnector(host, port, factory, timeout=timeout, bindAddress=bindAddress) c.connect() diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 644d67875b..0d72f6e870 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -231,6 +231,7 @@ class XendDomainInfo: DBVar('restart_time', ty='float'), DBVar('restart_count', ty='int'), DBVar('target', ty='long', path="memory/target"), + DBVar('device_model_pid', ty='int'), ] def __init__(self, db): @@ -275,6 +276,7 @@ class XendDomainInfo: self.vcpus = 1 self.vcpusdb = {} self.bootloader = None + self.device_model_pid = 0 def setDB(self, db): self.db = db @@ -457,6 +459,8 @@ class XendDomainInfo: sxpr.append(devs) if self.config: sxpr.append(['config', self.config]) + if self.device_model_pid: + sxpr.append(['device_model_pid',self.device_model_pid]) return sxpr def sxpr_devices(self): @@ -739,7 +743,8 @@ class XendDomainInfo: ctrl.initController(reboot=True) else: self.create_configured_devices() - self.image.createDeviceModel() + if not self.device_model_pid: + self.device_model_pid = self.image.createDeviceModel() def device_create(self, dev_config): """Create a new device. diff --git a/tools/python/xen/xend/image.py b/tools/python/xen/xend/image.py index 63687bab43..cf746ff722 100644 --- a/tools/python/xen/xend/image.py +++ b/tools/python/xen/xend/image.py @@ -262,7 +262,7 @@ class VmxImageHandler(ImageHandler): memmap = None memmap_value = [] device_channel = None - + pid = 0 def createImage(self): """Create a VM for the VMX environment. """ @@ -369,6 +369,7 @@ class VmxImageHandler(ImageHandler): log.info("spawning device models: %s %s", device_model, args) self.pid = os.spawnve(os.P_NOWAIT, device_model, args, env) log.info("device model pid: %d", self.pid) + return self.pid def vncParams(self): # see if a vncviewer was specified @@ -388,8 +389,11 @@ class VmxImageHandler(ImageHandler): def destroy(self): channel.eventChannelClose(self.device_channel) import signal + if not self.pid: + self.pid = self.vm.device_model_pid os.kill(self.pid, signal.SIGKILL) (pid, status) = os.waitpid(self.pid, 0) + self.pid = 0 def getDomainMemory(self, mem_mb): return (mem_mb * 1024) + self.getPageTableSize(mem_mb) diff --git a/tools/python/xen/xend/server/relocate.py b/tools/python/xen/xend/server/relocate.py index d19ec7c29e..01995193c9 100644 --- a/tools/python/xen/xend/server/relocate.py +++ b/tools/python/xen/xend/server/relocate.py @@ -140,7 +140,8 @@ def listenRelocation(): if xroot.get_xend_relocation_server(): port = xroot.get_xend_relocation_port() interface = xroot.get_xend_relocation_address() - reactor.listenTCP(port, factory, interface=interface) + l = reactor.listenTCP(port, factory, interface=interface) + l.setCloExec() def setupRelocation(dst, port): try: -- 2.30.2